package cn.edu.gzgs.service;

import cn.edu.gzgs.dto.PageQueryDTO;
import cn.edu.gzgs.dto.UserDTO;
import cn.edu.gzgs.entity.User;
import cn.edu.gzgs.vo.ImportResultVO;
import cn.edu.gzgs.vo.UserVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.edu.gzgs.dto.UserStatusUpdateDTO;
import cn.edu.gzgs.dto.UserRoleAssignDTO;
import cn.edu.gzgs.entity.Position;
import cn.edu.gzgs.entity.Title;
import cn.edu.gzgs.entity.Duty;
import cn.edu.gzgs.entity.Education;
import cn.edu.gzgs.entity.Role;
import cn.edu.gzgs.vo.BatchOperationResultVO;

import java.io.InputStream;
import java.util.List;

/**
 * 用户/教师管理服务接口
 *
 * @author Zyf
 */
public interface UserService extends IService<User> {

    /**
     * 分页查询教师列表
     *
     * @param pageQueryDTO 分页及查询参数
     * @return 分页结果
     */
    Page<UserVO> getUserPage(PageQueryDTO pageQueryDTO);

    /**
     * 根据ID获取教师详情
     *
     * @param id 教师ID
     * @return 教师详情VO
     */
    UserVO getUserById(Long id);

    /**
     * 新增或更新教师
     *
     * @param userDTO 教师数据
     * @return 返回保存后的用户ID
     */
    Long saveOrUpdateUser(UserDTO userDTO);

    /**
     * 逻辑删除用户及其所有关联
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteUserAndAssociations(Long userId);

    /**
     * 批量更新教师状态
     *
     * @param userStatusUpdateDTO 包含用户ID列表和目标状态
     * @return 批量操作结果
     */
    BatchOperationResultVO updateUserStatus(UserStatusUpdateDTO userStatusUpdateDTO);

    /**
     * 批量为用户分配角色
     *
     * @param userRoleAssignDTO 包含用户ID列表和角色ID列表
     * @return 批量操作结果
     */
    BatchOperationResultVO assignRolesToUsers(UserRoleAssignDTO userRoleAssignDTO);

    /**
     * 批量为用户取消分配角色
     *
     * @param userRoleAssignDTO 包含用户ID列表和角色ID列表
     * @return 批量操作结果
     */
    BatchOperationResultVO unassignRolesFromUsers(UserRoleAssignDTO userRoleAssignDTO);

    /**
     * 根据用户ID获取其职称列表
     *
     * @param userId 用户ID
     * @return 职称列表
     */
    List<Title> getTitlesByUserId(Long userId);

    /**
     * 根据用户ID获取其岗位列表
     *
     * @param userId 用户ID
     * @return 岗位列表
     */
    List<Position> getPositionsByUserId(Long userId);

    /**
     * 根据用户ID获取其角色列表
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    List<Role> getRolesByUserId(Long userId);

    /**
     * 根据用户ID获取其职务列表
     *
     * @param userId 用户ID
     * @return 职务列表
     */
    List<Duty> getDutiesByUserId(Long userId);

    /**
     * 根据用户ID获取其学历/学位列表
     *
     * @param userId 用户ID
     * @return 学历/学位列表
     */
    List<Education> getEducationsByUserId(Long userId);

    /**
     * 从输入流导入花名册数据
     *
     * @param inputStream 文件输入流
     * @return 导入结果，包含成功、失败计数及错误信息
     */
    ImportResultVO importRoster(InputStream inputStream, String filename);
} 